package notification

import (
	"encoding/json"
	"fmt"
	"time"
)

// FeishuCardMessage 飞书卡片消息
type FeishuCardMessage struct {
	MsgType string      `json:"msg_type"`
	Card    *FeishuCard `json:"card"`
}

// FeishuCard 飞书卡片
type FeishuCard struct {
	Config   *CardConfig   `json:"config,omitempty"`
	Elements []interface{} `json:"elements"`
	Header   *CardHeader   `json:"header,omitempty"`
}

// CardConfig 卡片配置
type CardConfig struct {
	EnableForward bool `json:"enable_forward"`
}

// CardHeader 卡片头部
type CardHeader struct {
	Title    *CardText `json:"title"`
	Template string    `json:"template,omitempty"`
}

// CardText 卡片文本
type CardText struct {
	Tag     string `json:"tag"`
	Content string `json:"content"`
}

// CardElement 卡片元素基类
type CardElement struct {
	Tag string `json:"tag"`
}

// CardDiv 分割线
type CardDiv struct {
	CardElement
}

// CardPlainText 纯文本
type CardPlainText struct {
	CardElement
	Content string `json:"content"`
}

// CardMarkdown Markdown文本
type CardMarkdown struct {
	CardElement
	Content string `json:"content"`
}

// CardField 字段
type CardField struct {
	CardElement
	Text *CardText `json:"text"`
}

// CardNote 备注
type CardNote struct {
	CardElement
	Elements []interface{} `json:"elements"`
}

// CardButton 按钮
type CardButton struct {
	CardElement
	Text  *CardText              `json:"text"`
	URL   string                 `json:"url,omitempty"`
	Type  string                 `json:"type,omitempty"`
	Value map[string]interface{} `json:"value,omitempty"`
}

// CardImage 图片
type CardImage struct {
	CardElement
	ImgKey string    `json:"img_key"`
	Alt    *CardText `json:"alt,omitempty"`
}

// NewCardMessage 创建卡片消息
func NewCardMessage() *FeishuCardMessage {
	return &FeishuCardMessage{
		MsgType: "interactive",
		Card: &FeishuCard{
			Config: &CardConfig{
				EnableForward: true,
			},
			Elements: []interface{}{},
		},
	}
}

// SetHeader 设置卡片头部
func (msg *FeishuCardMessage) SetHeader(title, template string) {
	msg.Card.Header = &CardHeader{
		Title: &CardText{
			Tag:     "plain_text",
			Content: title,
		},
		Template: template,
	}
}

// AddDiv 添加分割线
func (msg *FeishuCardMessage) AddDiv() {
	msg.Card.Elements = append(msg.Card.Elements, &CardDiv{
		CardElement: CardElement{Tag: "div"},
	})
}

// AddPlainText 添加纯文本
func (msg *FeishuCardMessage) AddPlainText(content string) {
	msg.Card.Elements = append(msg.Card.Elements, &CardPlainText{
		CardElement: CardElement{Tag: "plain_text"},
		Content:     content,
	})
}

// AddMarkdown 添加Markdown文本
func (msg *FeishuCardMessage) AddMarkdown(content string) {
	msg.Card.Elements = append(msg.Card.Elements, &CardMarkdown{
		CardElement: CardElement{Tag: "markdown"},
		Content:     content,
	})
}

// AddField 添加字段
func (msg *FeishuCardMessage) AddField(name, value string) {
	msg.Card.Elements = append(msg.Card.Elements, &CardMarkdown{
		CardElement: CardElement{Tag: "markdown"},
		Content:     fmt.Sprintf("**%s**: %s", name, value),
	})
}

// AddNote 添加备注
func (msg *FeishuCardMessage) AddNote(content string) {
	msg.Card.Elements = append(msg.Card.Elements, &CardNote{
		CardElement: CardElement{Tag: "note"},
		Elements: []interface{}{
			&CardPlainText{
				CardElement: CardElement{Tag: "plain_text"},
				Content:     content,
			},
		},
	})
}

// AddButton 添加按钮
func (msg *FeishuCardMessage) AddButton(text, url string, buttonType string) {
	msg.Card.Elements = append(msg.Card.Elements, &CardButton{
		CardElement: CardElement{Tag: "button"},
		Text: &CardText{
			Tag:     "plain_text",
			Content: text,
		},
		URL:  url,
		Type: buttonType,
	})
}

// ToJSON 转换为JSON
func (msg *FeishuCardMessage) ToJSON() ([]byte, error) {
	return json.Marshal(msg)
}

// CreateProcessAlertCard 创建进程告警卡片
func CreateProcessAlertCard(processName, status, message, serverID string) *FeishuCardMessage {
	card := NewCardMessage()

	// 设置头部
	card.SetHeader("🚨 进程监控告警", "red")

	// 添加信息（使用markdown格式）
	card.AddMarkdown(fmt.Sprintf("**服务器**: %s", serverID))
	card.AddMarkdown(fmt.Sprintf("**进程名称**: %s", processName))
	card.AddMarkdown(fmt.Sprintf("**状态**: %s", status))
	card.AddMarkdown(fmt.Sprintf("**时间**: %s", time.Now().Format("2006-01-02 15:04:05")))

	// 添加分割线
	card.AddDiv()

	// 添加详情
	card.AddMarkdown(fmt.Sprintf("**详情**: %s", message))

	// 添加备注
	card.AddNote("请及时处理进程异常，避免影响业务正常运行")

	return card
}

// CreateProcessRestartCard 创建进程重启卡片
func CreateProcessRestartCard(processName string, restartCount int, message, serverID string) *FeishuCardMessage {
	card := NewCardMessage()

	// 设置头部
	card.SetHeader("🔄 进程重启告警", "orange")

	// 添加信息（使用markdown格式）
	card.AddMarkdown(fmt.Sprintf("**服务器**: %s", serverID))
	card.AddMarkdown(fmt.Sprintf("**进程名称**: %s", processName))
	card.AddMarkdown(fmt.Sprintf("**重启次数**: %d", restartCount))
	card.AddMarkdown(fmt.Sprintf("**时间**: %s", time.Now().Format("2006-01-02 15:04:05")))

	// 添加分割线
	card.AddDiv()

	// 添加详情
	card.AddMarkdown(fmt.Sprintf("**详情**: %s", message))

	// 添加备注
	card.AddNote("进程重启失败，请检查配置和依赖")

	return card
}

// CreateProcessRecoveryCard 创建进程恢复卡片
func CreateProcessRecoveryCard(processName, serverID string) *FeishuCardMessage {
	card := NewCardMessage()

	// 设置头部
	card.SetHeader("✅ 进程恢复通知", "green")

	// 添加信息（使用markdown格式）
	card.AddMarkdown(fmt.Sprintf("**服务器**: %s", serverID))
	card.AddMarkdown(fmt.Sprintf("**进程名称**: %s", processName))
	card.AddMarkdown(fmt.Sprintf("**状态**: 已恢复"))
	card.AddMarkdown(fmt.Sprintf("**时间**: %s", time.Now().Format("2006-01-02 15:04:05")))

	// 添加分割线
	card.AddDiv()

	// 添加备注
	card.AddNote("进程已恢复正常运行")

	return card
}

// CreateSystemAlertCard 创建系统告警卡片
func CreateSystemAlertCard(title, message, serverID string) *FeishuCardMessage {
	card := NewCardMessage()

	// 设置头部
	card.SetHeader(fmt.Sprintf("⚠️ 系统告警 - %s", title), "red")

	// 添加信息（使用markdown格式）
	card.AddMarkdown(fmt.Sprintf("**服务器**: %s", serverID))
	card.AddMarkdown(fmt.Sprintf("**告警类型**: %s", title))
	card.AddMarkdown(fmt.Sprintf("**时间**: %s", time.Now().Format("2006-01-02 15:04:05")))

	// 添加分割线
	card.AddDiv()

	// 添加详情
	card.AddMarkdown(fmt.Sprintf("**详情**: %s", message))

	// 添加备注
	card.AddNote("请及时处理系统异常")

	return card
}

// CreateTestCard 创建测试卡片
func CreateTestCard(serverID string) *FeishuCardMessage {
	card := NewCardMessage()

	// 设置头部
	card.SetHeader("🧪 飞书通知测试", "blue")

	// 添加信息（使用markdown格式）
	card.AddMarkdown(fmt.Sprintf("**服务器**: %s", serverID))
	card.AddMarkdown(fmt.Sprintf("**测试时间**: %s", time.Now().Format("2006-01-02 15:04:05")))
	card.AddMarkdown(fmt.Sprintf("**状态**: 测试成功"))

	// 添加分割线
	card.AddDiv()

	// 添加详情
	card.AddMarkdown("这是一条测试消息，用于验证飞书通知配置是否正确。")

	// 添加备注
	card.AddNote("如果收到此消息，说明飞书通知配置正常")

	return card
}

// CreateProcessGroupAlertCard 创建进程组告警卡片
func CreateProcessGroupAlertCard(groupName, status, message, serverID string) *FeishuCardMessage {
	card := NewCardMessage()

	// 设置头部
	headerText := "🔔 进程组告警"
	headerColor := "red"
	if status == "warning" {
		headerColor = "orange"
	}

	card.SetHeader(headerText, headerColor)

	// 添加信息
	card.AddMarkdown(fmt.Sprintf("**服务器**: %s", serverID))
	card.AddMarkdown(fmt.Sprintf("**进程组**: %s", groupName))
	card.AddMarkdown(fmt.Sprintf("**状态**: %s", status))
	card.AddMarkdown(fmt.Sprintf("**时间**: %s", time.Now().Format("2006-01-02 15:04:05")))

	// 添加分割线
	card.AddDiv()

	// 添加详情（支持多行消息）
	card.AddMarkdown(fmt.Sprintf("**详情**:\n%s", message))

	// 添加备注
	card.AddNote("进程组状态异常，请检查相关进程")

	return card
}

// CreateProcessGroupRestartCard 创建进程组重启卡片
func CreateProcessGroupRestartCard(groupName, message, serverID string, isSuccess bool) *FeishuCardMessage {
	card := NewCardMessage()

	// 设置头部
	headerText := "🔄 进程组重启"
	headerColor := "green"
	if !isSuccess {
		headerText = "❌ 进程组重启失败"
		headerColor = "red"
	}

	card.SetHeader(headerText, headerColor)

	// 添加信息
	card.AddMarkdown(fmt.Sprintf("**服务器**: %s", serverID))
	card.AddMarkdown(fmt.Sprintf("**进程组**: %s", groupName))
	card.AddMarkdown(fmt.Sprintf("**时间**: %s", time.Now().Format("2006-01-02 15:04:05")))

	// 添加分割线
	card.AddDiv()

	// 添加详情
	card.AddMarkdown(fmt.Sprintf("**详情**:\n%s", message))

	// 添加备注
	if isSuccess {
		card.AddNote("进程组重启成功")
	} else {
		card.AddNote("进程组重启失败，请检查配置和依赖")
	}

	return card
}
